package com.by.controller;

import com.by.common.bean.ResultBean;
import com.by.common.controller.BaseController;
import com.by.common.utils.DateUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

@RestController
@Api(tags = "文件上传")
@RequestMapping("/v1")
public class UploadController extends BaseController {

    final String DIR = "/attachment";

    final Set<String> imgSet = new HashSet<>();
    final Set<String> videoSet = new HashSet<>();

    /**
     * 初始化图片的类型
     */ {
        imgSet.add("image/jpeg");
        imgSet.add("image/png");
        videoSet.add("video/mp4");
        videoSet.add("video/avi");
    }


    /**
     * 添加单个图片
     *
     * @param file    要上传的文件
     * @param request 请求域对象  可以获取服务器存储目录
     * @return 返回上传结果的封装对象
     */
    @ApiOperation("添加单个图片")
    @PostMapping("/upload/img")
    public ResultBean addSingleImage(@RequestParam("file") MultipartFile file, HttpServletRequest request) {
        // 获取文件的类型
        String type = file.getContentType();
        // 检查文件类型是否为允许的图片格式
        if (!imgSet.contains(type)) {
            // 返回错误提示，如果文件类型不在允许的图片格式列表中
            return fail("请上传：jpg、png格式的文件");
        }
        // 调用上传方法处理单个文件，并获取其存储路径
        String path = upload(file, request, "images");
        // 返回成功提示及上传图片的路径
        return success("单个图片上传成功", path);
    }


    /**
     * 上传视频
     *
     * @param file    要上传的文件
     * @param request 请求域对象  可以获取服务器存储目录
     * @return
     */
    @ApiOperation("上传视频")
    @PostMapping("/upload/video")
    public ResultBean uploadVideo(MultipartFile file, HttpServletRequest request) {
        String type = file.getContentType();
        if (!videoSet.contains(type)) {
            return fail("请上传：mp4、avi格式的视频");
        }
        String path = upload(file, request, "video");
        return success("上传成功", path);
    }

    /**
     * 批量上传图片
     *
     * @param files   要上传的文件列表
     * @param request 请求域对象  可以获取服务器存储目录
     * @return 返回上传结果的封装对象
     */
    @ApiOperation("批量上传图片")
    @PostMapping("/upload/images/batch")
    public ResultBean batchUploadImages(@RequestParam("files") MultipartFile[] files, HttpServletRequest request) {
        // 存储成功上传图片的路径列表
        List<String> paths = new ArrayList<>();
        // 遍历上传的文件
        for (MultipartFile file : files) {
            // 获取文件的类型
            String type = file.getContentType();
            // 检查文件类型是否为允许的图片格式
            if (!imgSet.contains(type)) {
                // 返回错误提示，如果文件类型不在允许的图片格式列表中
                return fail("请上传：jpg、png格式的文件");
            }
            // 调用上传方法处理单个文件，并获取其存储路径
            String path = upload(file, request, "images");
            // 将路径添加到列表中
            paths.add(path);
        }
        // 返回成功提示及上传图片的路径列表
        return success("批量上传成功", paths);
    }


    /**
     * 上传
     *
     * @param file
     * @param request
     * @param type
     * @return
     */
    private String upload(MultipartFile file, HttpServletRequest request, String type) {
        //原始文件名称
        String fileName = file.getOriginalFilename();
        //获取文件的后缀
        String ext = getExt(fileName);
        //生成新的文件名
        String newFileName = System.currentTimeMillis() + ext;

        //获取服务器根目录
        String root = request.getServletContext().getRealPath("/");
        String tmpDir = DIR + "/" + type + "/" + DateUtils.getYmd();
        File dirFile = new File(root + tmpDir);
        if (!dirFile.exists())
            dirFile.mkdirs();//创建目录

        //将上传的文件拷贝到指定目录
        try {
            file.transferTo(new File(dirFile, newFileName));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        //上传成功
        String path = tmpDir + "/" + newFileName;
        return path;
    }


    /**
     * 获取文件后缀
     *
     * @param fileName
     * @return
     */
    String getExt(String fileName) {
        //获取.的位置
        int pos = fileName.lastIndexOf(".");
        return fileName.substring(pos);// 包含
    }
}
